import type { AxiosOperator } from '@/common/infrastructure/axios_operator.ts'
import type { UserInfo } from '@/common/model/app_server/outputs/user_info'
import type { PageModel } from '@/common/model/app/page_model'
import type { RoleInfo } from '@/common/model/app_server/outputs/role_info'
import type { MenuInfo } from '@/common/model/app_server/outputs/menu_info'

export class UserApi {
  // 请求操作者
  private _requestOperator: AxiosOperator

  // 请求路由
  private controller: string = '/User'

  /**
   * 有参构造方法
   * @param requestOperator 请求操作者
   * */
  constructor(requestOperator: AxiosOperator) {
    this._requestOperator = requestOperator
  }

  //region # 创建用户 —— createUser(loginId: string...)
  /**
   * 创建用户
   * @param loginId 用户名
   * @param realName 真实姓名
   * @param password 密码
   * */
  public async createUser(loginId: string, realName: string, password: string) {
    await this._requestOperator.post(`${this.controller}/CreateUser`, {
      loginId,
      realName,
      password,
    })
  }
  //endregion

  //region # 修改密码 —— updatePassword(loginId: string...)
  /**
   * 修改密码
   * @param loginId 用户名
   * @param oldPassword 真实姓名
   * @param newPassword 密码
   * */
  public async updatePassword(loginId: string, oldPassword: string, newPassword: string) {
    await this._requestOperator.post(`${this.controller}/UpdatePassword`, {
      loginId,
      oldPassword,
      newPassword,
    })
  }
  //endregion

  //region # 重置密码 —— resetPassword(loginId: string...)
  /**
   * 重置密码
   * @param loginId 用户名
   * @param password 真实姓名
   * */
  public async resetPassword(loginId: string, password: string) {
    await this._requestOperator.post(`${this.controller}/ResetPassword`, {
      loginId,
      password,
    })
  }
  //endregion

  //region # 启用用户 —— enableUser(loginId: string)
  /**
   * 启用用户
   * @param loginId 用户名
   * */
  public async enableUser(loginId: string) {
    await this._requestOperator.post(`${this.controller}/EnableUser`, {
      loginId,
    })
  }
  //endregion

  //region # 停用用户 —— disableUser(loginId: string)
  /**
   * 停用用户
   * @param loginId 用户名
   * */
  public async disableUser(loginId: string) {
    await this._requestOperator.post(`${this.controller}/DisableUser`, {
      loginId,
    })
  }
  //endregion

  //region # 删除用户 —— removeUser(loginId: string)
  /**
   * 删除用户
   * @param loginId 用户名
   * */
  public async removeUser(loginId: string) {
    await this._requestOperator.post(`${this.controller}/RemoveUser`, {
      loginId,
    })
  }
  //endregion

  //region # 关联角色到用户 —— relateRolesToUser(loginId: string...)
  /**
   * 关联角色到用户
   * @param loginId 用户名
   * @param roleIds 角色Id集
   * */
  public async relateRolesToUser(loginId: string, roleIds: Array<string>) {
    await this._requestOperator.post(`${this.controller}/RelateRolesToUser`, {
      loginId,
      roleIds,
    })
  }
  //endregion

  //region # 追加角色到用户 —— appendRolesToUser(loginId: string...)
  /**
   * 追加角色到用户
   * @param loginId 用户名
   * @param roleIds 角色Id集
   * */
  public async appendRolesToUser(loginId: string, roleIds: Array<string>) {
    await this._requestOperator.post(`${this.controller}/AppendRolesToUser`, {
      loginId,
      roleIds,
    })
  }
  //endregion

  //region # 获取用户 —— getUser(loginId: string...)
  /**
   * 获取用户
   * @param loginId 用户名
   * */
  public async getUser(loginId: string): Promise<UserInfo> {
    return await this._requestOperator.get(`${this.controller}/GetUser`, {
      loginId,
    })
  }
  //endregion

  //region # 获取用户列表 —— getUsers(keywords: string...)
  /**
   * 获取用户列表
   * @param keywords 关键字
   * @param roleId 角色Id
   * */
  public async getUsers(keywords: string | null, roleId: string | null): Promise<Array<UserInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetUsers`, {
      keywords,
      roleId,
    })
  }

  //endregion

  //region # 分页获取用户列表 —— getUsersByPage(keywords: string...)
  /**
   * 分页获取用户列表
   * @param keywords 关键字
   * @param roleId 角色Id
   * @param pageIndex - 页码
   * @param pageSize - 页容量
   * */
  public async getUsersByPage(
    keywords: string | null,
    roleId: string | null,
    pageIndex: number,
    pageSize: number,
  ): Promise<PageModel<UserInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetUsersByPage`, {
      keywords,
      roleId,
      pageIndex,
      pageSize,
    })
  }

  //endregion

  //region # 获取用户菜单列表 —— getUserMenus(loginId: string)
  /**
   * 获取用户菜单列表
   * @param loginId 用户名
   * */
  public async getUserMenus(loginId: string): Promise<Array<MenuInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetUserMenus`, {
      loginId,
    })
  }

  //endregion

  //region # 获取用户角色列表 —— getUserRoles(loginId: string)
  /**
   * 获取用户角色列表
   * @param loginId 用户名
   * */
  public async getUserRoles(loginId: string): Promise<Array<RoleInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetUserRoles`, {
      loginId,
    })
  }

  //endregion

  //region # 获取用户权限列表 —— getUserAuthorities(loginId: string)
  /**
   * 获取用户权限列表
   * @param loginId 用户名
   * */
  public async getUserAuthorities(loginId: string): Promise<Array<RoleInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetUserAuthorities`, {
      loginId,
    })
  }

  //endregion

  //region # 分页获取登录记录列表 —— getLoginRecordsByPage(keywords: string...)
  /**
   * 分页获取登录记录列表
   * @param keywords 关键字
   * @param startTime - 起始时间
   * @param endTime - 截止时间
   * @param pageIndex - 页码
   * @param pageSize - 页容量
   * */
  public async getLoginRecordsByPage(
    keywords: string | null,
    startTime: Date | null,
    endTime: Date | null,
    pageIndex: number,
    pageSize: number,
  ): Promise<PageModel<UserInfo>> {
    return await this._requestOperator.get(`${this.controller}/GetLoginRecordsByPage`, {
      keywords,
      startTime,
      endTime,
      pageIndex,
      pageSize,
    })
  }

  //endregion

  //region # 是否存在用户 —— existsUser(loginId: string)
  /**
   * 是否存在用户
   * @param loginId 用户名
   * */
  public async existsUser(loginId: string): Promise<Array<RoleInfo>> {
    return await this._requestOperator.get(`${this.controller}/ExistsUser`, {
      loginId,
    })
  }

  //endregion
}
